package com.gitee.zhanyao.common.util;

import com.gitee.zhanyao.common.model.BetweenDate;


import javax.validation.constraints.NotNull;
import java.time.LocalDate;

/**
 * 日期工具类
 */
public class DateUtil {

    private DateUtil() {
    }

    /**
     * 计算截止到当前日期的年龄
     * 周岁算法：人出生时为 0 岁，每过一个生日就长一岁。
     *
     * @param birthday 出生日期
     * @return 年龄
     */
    public static int getAge(LocalDate birthday) {
        return getAge(LocalDate.now(), birthday);
    }

    /**
     * 计算截止到指定日期的年龄
     *
     * @param nowDate  指定日期
     * @param birthday 出生日期
     * @return 年龄
     */
    public static int getAge(@NotNull LocalDate nowDate, @NotNull LocalDate birthday) {
        if (nowDate.isBefore(birthday)) {
            throw new IllegalArgumentException("出生日期不能是未来的日期");
        }
        return birthday.until(nowDate).getYears();
    }

    /**
     * 求两个年龄日期范围
     * 周岁算法：人出生时为 0 岁，每过一个生日就长一岁。每一个年龄对应的是一年的时间。
     * 例：假如今天是 2019-08-13，
     * 如果要获取 1 岁的人，则生日的范围为 (2017-08-13, 2018-08-13]；
     * 如果要获取 2 岁的人，则生日的范围为 (2016-08-13, 2017-08-13]；
     * 如果要获取 1 - 2 岁的人，则生日的范围为 (2016-08-13, 2018-08-13]；
     *
     * @param beginAge 开始年龄，可以为 null
     * @param endAge   结束年龄，可以为 null
     * @return 生日的日期范围；如果 beginAge 和 endAge 都是 null，则日期范围里的日期也是 null 值；否则日期范围里的日期必定存在值。
     */
    public static BetweenDate getAgeBetween(Integer beginAge, Integer endAge) {
        return getAgeBetween(LocalDate.now(), beginAge, endAge);
    }

    /**
     * 求两个年龄日期范围
     * 周岁算法：人出生时为 0 岁，每过一个生日就长一岁。每一个年龄对应的是一年的时间。
     * 例：假如今天是 2019-08-13，
     * 如果要获取 1 岁的人，则生日的范围为 (2017-08-13, 2018-08-13]；
     * 如果要获取 2 岁的人，则生日的范围为 (2016-08-13, 2017-08-13]；
     * 如果要获取 1 - 2 岁的人，则生日的范围为 (2016-08-13, 2018-08-13]；
     *
     * @param nowDate  计算年龄的截止日期
     * @param beginAge 开始年龄，可以为 null
     * @param endAge   结束年龄，可以为 null
     * @return 生日的日期范围；如果 beginAge 和 endAge 都是 null，则日期范围里的日期也是 null 值；否则日期范围里的日期必定存在值。
     */
    public static BetweenDate getAgeBetween(@NotNull LocalDate nowDate, Integer beginAge, Integer endAge) {
        LocalDate beginAgeDate = null;
        LocalDate endAgeDate = null;
        long addYears;
        if (beginAge != null && endAge == null) {
            addYears = -1L * beginAge;
            endAgeDate = nowDate.plusYears(addYears);
            beginAgeDate = endAgeDate.plusYears(-1);
        } else if (beginAge == null && endAge != null) {
            addYears = -1L * endAge;
            endAgeDate = nowDate.plusYears(addYears);
            beginAgeDate = endAgeDate.plusYears(-1);
        } else if (beginAge != null) {
            addYears = -1L * beginAge;
            endAgeDate = nowDate.plusYears(addYears);
            addYears = -1L * endAge - 1;
            beginAgeDate = nowDate.plusYears(addYears);
        }
        return new BetweenDate(beginAgeDate, endAgeDate);
    }

}
